package com.study.config;

/**
 * AOP : 【动态代理】
 *  指在程序执行期间动态的将 某段代码切入到指定方法的指定位置进行运行的编程方式；
 *
 *  1.导入aop 模块： spring aop（spring-aspects）
 *  2.定义一个业务逻辑类 （MathCalculator）：在业务逻辑运行的时候将日志进行打印（方法之前，方法运行结束，方法出现异常，xxx）
 *  3.定义一个日志切面类，（LogStart）：切面类里面的方法需要动态感知 MathCalculator.div 运行到哪里然后执行
 *      通知方法：
 *          前置通知(@Before)： logstart 在目标方法 div 运行之前执行
 *          后置通知(@After)： logend 在目标方法 div 运行结束之后执行
 *          返回通知(@AfterReturning)：logReturn 在目标方法 div 正常返回之后执行
 *          异常通知(@AfterThrowing)：logException 在目标方法 div 出现异常以后执行
 *          环绕通知(@Around)：动态代理，手动的推进目标方法的运行  joinPoint.procced()
 *  4.给切面类的目标方法标注何时何地运行
 *  5.给切面类 和    业务逻辑类（目标方法所在类） 都加入到容器中
 *  6.必须告诉spring 容器哪一个是切面类（给切面类加上一个注解 @Aspect）
 *  [7.]  给配置类 加 @EnableAspectJAutoProxy 【开启基于注解的 AOP 模式】
 *         spring 中有很多的 @Enable XXX;
 *
 *
 *       三步：
 *          1) 将业务逻辑组件和切面类都加入到容器中，告诉spring 哪个是切面类
 *          2） 在切面类上的每一个通知方法上标注通知注解，告诉 spring 何时何地运行（切入点表达式）
 *          3） 开启注解的 aop 模式； @EnableAspectJAutoProxy
 *              xml方式: <aop:aspectj-autoproxy/> 让Spring能够自动扫描被@Aspect标注的切面
 *
 * @author wuwenbo
 * @date 2020/4/13 - 21:55
 */

import com.study.bean.aop.LogAspects;
import com.study.bean.aop.MathCalculator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAop {

    //业务逻辑类加入到容器中
    @Bean
    public MathCalculator mathCalculator(){
        return new MathCalculator();
    }

    //切面类加入到容器中
    @Bean
    public LogAspects LogAspects(){
        return new LogAspects();
    }

}
